vimfandomcom-20200223-history
Folding
It is convenient to temporarily fold away (hide) parts of your file, leaving only an outline of the major parts visible. This tip presents an overview of using folding. Many programming languages have a syntax file that supports folding. Typically, each function is regarded as a fold that can be opened or closed. With all folds closed, you see only the first line of each function for an overview of the program. Opening and closing folds The command zc will close a fold (if the cursor is in an open fold), and zo will open a fold (if the cursor is in a closed fold). It's easier to just use za which will toggle the current fold (close it if it was open, or open it if it was closed). The commands zc (close), zo (open), and za (toggle) operate on one level of folding, at the cursor. The commands zC, zO and zA are similar, but operate on all folding levels (for example, the cursor line may be in an open fold, which is inside another open fold; typing zC would close all folds at the cursor). The command zr reduces folding by opening one more level of folds throughout the whole buffer (the cursor position is not relevant). Use zR to remove all folds. The command zm gives more folding by closing one more level of folds throughout the whole buffer. Use zM to close all folds. Mappings to toggle folds With the following in your vimrc, you can toggle folds open/closed by pressing F9. In addition, if you have :set foldmethod=manual, you can visually select some lines, then press F9 to create a fold. inoremap za nnoremap za onoremap za vnoremap zf Here is an alternative procedure: In normal mode, press Space to toggle the current fold open/closed. However, if the cursor is not in a fold, move to the right (the default behavior). In addition, with the manual fold method, you can create a fold by visually selecting some lines, then pressing Space. nnoremap @=(foldlevel('.')?'za':'l') vnoremap zf In the first mapping for Space, @= refers to the expression register ( ). The following expression is evaluated when Enter is pressed (). The value of foldlevel('.') is determined (the fold level at the current line, or zero if the current line is not in a fold). If the result is nonzero (true), the result is 'za' (toggle fold); otherwise it is 'l' (move right). Folding methods The 'foldmethod' option (abbreviated to 'fdm') is local to each window. It determines what kind of folding applies in the current window. Commonly used values are: *manual – folds must be defined by entering commands *indent – groups of lines with the same indent form a fold *syntax – folds are defined by syntax highlighting In addition, foldmethod may be expr (an expression to calculate the fold level can be entered), or marker (special characters can be manually entered to flag the start and end of folds – mostly obsolete), or diff (used to fold unchanged text when viewing differences). Manual folding TODO: Need a few lines. Incorporate the following information. It's best to use syntax folding, but if you just want to enter a few folds in a program that uses braces around blocks ({...}), you can use the command zfa} to create a fold for the block containing the cursor. Use zd to delete a fold (no text is deleted; the fold at the cursor is removed). Indent folding TODO: Need a few lines. Syntax folding Try setting foldmethod=syntax. Many syntax files define folding based on the language syntax, although you may need to enable it by setting syntax file options. If a specific syntax file doesn't define folding, you can define your own. Indent folding with manual folds If you like the convenience of having Vim define folds automatically by indent level, but would also like to create folds manually, you can get both by putting this in your vimrc: augroup vimrc au BufReadPre * setlocal foldmethod=indent au BufWinEnter * if &fdm 'indent' | setlocal foldmethod=manual | endif augroup END The first autocommand sets 'indent' as the fold method before a file is loaded, so that indent-based folds will be defined. The second one allows you to manually create folds while editing. It's executed after the modeline is read, so it won't change the fold method if the modeline set the fold method to something else like 'marker' or 'syntax'. References * * * * * * See also *Syntax folding of Vim scripts Comments